package orm

import (
	"crypto/sha256"
	"encoding/hex"
	"github.com/redis/go-redis/v9"
	"hertz_demo/orm/cache"
	"strconv"
	"time"
)

func GenerateToken(username string) string {
	currentTime := time.Now().String()
	str := currentTime + username
	hasher := sha256.New()
	hasher.Write([]byte(str))
	token := hasher.Sum(nil)
	return hex.EncodeToString(token)
}

func SetToken(userId int64, token string) {
	cache.RedisCli.Set(cache.RedisCtx, cache.TokenPrefix+token, userId, 0)
	oldToken, err := cache.RedisCli.HGet(cache.RedisCtx, cache.UserPrefix+strconv.FormatInt(userId, 10), "token").Result()
	if err != redis.Nil {
		cache.RedisCli.Del(cache.RedisCtx, cache.TokenPrefix+oldToken)
	}
	cache.RedisCli.HSet(cache.RedisCtx, cache.UserPrefix+strconv.FormatInt(userId, 10), "token", token)
}

func CheckToken(token string) (int64, error) {
	userId, err := cache.RedisCli.Get(cache.RedisCtx, "token:"+token).Int64()
	if err == redis.Nil {
		return 0, err
	} else if err != nil {
		panic(err)
	}
	currentToken, err := cache.RedisCli.HGet(cache.RedisCtx, cache.UserPrefix+strconv.FormatInt(userId, 10), "token").Result()
	if err != nil || currentToken != token {
		return 0, err
	}
	return userId, nil
}
